"""
主题: 定义有可选参数的元类
问题: 你想定义一个元类，允许类定义时提供可选参数，这样可以控制或配置类型的创建过程。
提示 : 
"""

from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
    '''抽象基类'''
    @abstractmethod
    def read(self, maxsize=None):
        pass

    @abstractmethod
    def write(self, data):
        pass

class MyMeta(type):
    # Optional
    @classmethod
    def __prepare__(cls, name, bases, *, debug=False, synchronize=False):
        '''类定义开始执行前首先被调用，用来创建类命名空间，通常来讲，这个方法只是简单的返回一个字典或其他映射对象'''
        # Custom processing
        return super().__prepare__(name, bases)

    # Required
    def __new__(cls, name, bases, ns, *, debug=False, synchronize=False):
        '''实例化最终的类对象'''
        # Custom processing
        return super().__new__(cls, name, bases, ns)

    # Required
    def __init__(self, name, bases, ns, *, debug=False, synchronize=False):
        '''最后被调用，用来执行其他的一些初始化工作'''
        # Custom processing
        super().__init__(name, bases, ns)

class Spam(metaclass=MyMeta, debug=True, synchronize=True):
    pass   

class Spam1(metaclass=MyMeta):
    debug = True
    synchronize = True